const crypto = require('crypto');

// 企业微信配置
const WEWORK_CONFIG = {
  corpId: process.env.WEWORK_CORP_ID,
  agentId: process.env.WEWORK_AGENT_ID,
  secret: process.env.WEWORK_SECRET
};

// 管理员用户ID列表（从环境变量或配置文件读取）
const ADMIN_USERS = (process.env.WEWORK_ADMIN_USERS || '').split(',').filter(id => id.trim());

// 企业微信 Access Token 缓存
let accessTokenCache = {
  token: null,
  expires: 0
};

// 获取企业微信 Access Token
async function getAccessToken() {
  // 检查缓存是否有效
  if (accessTokenCache.token && Date.now() < accessTokenCache.expires) {
    return accessTokenCache.token;
  }

  try {
    const response = await fetch(`https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${WEWORK_CONFIG.corpId}&corpsecret=${WEWORK_CONFIG.secret}`);
    const data = await response.json();
    
    if (data.errcode === 0) {
      accessTokenCache.token = data.access_token;
      accessTokenCache.expires = Date.now() + (data.expires_in - 300) * 1000; // 提前5分钟过期
      return data.access_token;
    } else {
      throw new Error(`获取Access Token失败: ${data.errmsg}`);
    }
  } catch (error) {
    console.error('获取企业微信Access Token错误:', error);
    throw error;
  }
}

// 获取用户信息
async function getUserInfo(code) {
  try {
    const accessToken = await getAccessToken();
    
    // 通过code获取用户ID
    const userResponse = await fetch(`https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=${accessToken}&code=${code}`);
    const userData = await userResponse.json();
    
    if (userData.errcode !== 0) {
      throw new Error(`获取用户信息失败: ${userData.errmsg}`);
    }
    
    if (!userData.UserId) {
      throw new Error('未获取到用户ID');
    }
    
    // 获取用户详细信息
    const detailResponse = await fetch(`https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=${accessToken}&userid=${userData.UserId}`);
    const detailData = await detailResponse.json();
    
    if (detailData.errcode !== 0) {
      throw new Error(`获取用户详细信息失败: ${detailData.errmsg}`);
    }
    
    return {
      userId: userData.UserId,
      name: detailData.name,
      department: detailData.department,
      position: detailData.position,
      isAdmin: checkIsAdmin(userData.UserId, detailData)
    };
  } catch (error) {
    console.error('获取企业微信用户信息错误:', error);
    throw error;
  }
}

// 检查用户是否为管理员
function checkIsAdmin(userId, userDetail) {
  // 1. 检查是否在管理员用户列表中
  if (ADMIN_USERS.includes(userId)) {
    return true;
  }
  
  // 2. 检查是否为企业管理员（根据部门或职位判断）
  if (userDetail.position && userDetail.position.includes('管理员')) {
    return true;
  }
  
  // 3. 检查是否在管理部门（部门ID为1通常是管理部门）
  if (userDetail.department && userDetail.department.includes(1)) {
    return true;
  }
  
  return false;
}

// 认证中间件
const weworkAuth = async (req, res, next) => {
  try {
    // 检查是否已经认证
    if (req.session && req.session.user && req.session.user.isAdmin) {
      return next();
    }
    
    // 检查是否有企业微信授权码
    const code = req.query.code;
    if (!code) {
      // 重定向到企业微信授权页面
      const redirectUri = encodeURIComponent(`${req.protocol}://${req.get('host')}${req.originalUrl}`);
      const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${WEWORK_CONFIG.corpId}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_base&agentid=${WEWORK_CONFIG.agentId}&state=auth#wechat_redirect`;
      
      return res.redirect(authUrl);
    }
    
    // 通过授权码获取用户信息
    const userInfo = await getUserInfo(code);
    
    // 检查用户是否为管理员
    if (!userInfo.isAdmin) {
      return res.status(403).json({
        success: false,
        message: '访问被拒绝：只有企业管理员或应用管理员才能访问此系统',
        userInfo: {
          name: userInfo.name,
          userId: userInfo.userId,
          position: userInfo.position
        }
      });
    }
    
    // 保存用户信息到会话
    if (!req.session) {
      req.session = {};
    }
    req.session.user = userInfo;
    
    // 移除URL中的code参数，避免重复使用
    const cleanUrl = req.originalUrl.split('?')[0];
    if (req.originalUrl !== cleanUrl) {
      return res.redirect(cleanUrl);
    }
    
    next();
  } catch (error) {
    console.error('企业微信认证错误:', error);
    res.status(500).json({
      success: false,
      message: '认证失败，请稍后重试',
      error: error.message
    });
  }
};

// 检查认证状态的中间件（不强制重定向）
const checkAuth = (req, res, next) => {
  if (req.session && req.session.user && req.session.user.isAdmin) {
    res.locals.user = req.session.user;
    res.locals.isAuthenticated = true;
  } else {
    res.locals.isAuthenticated = false;
  }
  next();
};

// 登出功能
const logout = (req, res) => {
  if (req.session) {
    req.session.destroy((err) => {
      if (err) {
        console.error('登出错误:', err);
      }
    });
  }
  res.redirect('/login');
};

module.exports = {
  weworkAuth,
  checkAuth,
  logout,
  getUserInfo,
  getAccessToken
};